#pragma once

#include<pthread.h>
#include<iostream>
#include<string>
#include<functional>
#include<sys/syscall.h>
#include<unistd.h>
#include"Logger.hpp"
#define get_lwp_id() syscall(SYS_gettid)

using func_t = std::function<void(const std::string& name)>;
const std::string threadnamedefault = "None_Name";

class Thread
{
private:
    static void* start_routine(void* args)//成员函数会自带this 指针，为了减少提供Get函数，将其修改为static 函数
    {
        //静态成员函数无法直接访问非静态成员变量，我们可以将this 指针以参数的形式传递进来
        Thread* self = static_cast<Thread*>(args);
        self->_is_running = true;
        self->_lwpid = get_lwp_id();
        self->_func(self->_name);//调用任务
        pthread_exit((void*)0);
    }
public:
    //构造，_func 与 _name 需要传参
    Thread(func_t func , std::string name = threadnamedefault)
    :_func(func)
    ,_name(name)
    ,_is_running(false)
    {}
    ~Thread()
    {}

    //创建线程 -> pthread_create
    void Start()
    {
        int n = pthread_create(&_tid , nullptr , start_routine , this);
        //debug
        if(n==0)
        {
            //日志
            LOG(LogLevel::INFO) << _name << " 创建成功";
        }
    }
    //等待线程
    void Join()
    {
        int n = pthread_join(_tid , nullptr);//等待线程不用&
        //debug
        if(n==0)
        {
            //日志
            LOG(LogLevel::INFO) <<_name <<  " 等待成功";
        }
    }

private:
    //线程的属性
    pthread_t _tid;//tid 其实就是thread 对象的地址
    pid_t _lwpid;//需要syscall
    std::string _name;
    func_t _func;

    bool _is_running;
};